AWS Elemental MediaLive の入力側フェイルオーバーを試してみた
こんにちは、大前です。
今日は、先日のアップデートで AWS Elemental MediaLive に追加された Input Failover を試してみたいと思います。
[アップデート] AWS Elemental MediaConnect と AWS Elemental MediaLive で入力ソースに対するフェイルオーバー設定が可能となりました!
やりたい事
下記のような、OBS で RTMP プッシュ入力を MediaLive で受け付け、HLS に変換して MediaStore に格納する様な構成を検討します。
この時、MediaLive に対する入力を 2つ作成し、片方を Primary、残りを Secondary に設定します。
Primary、Secondary 共に MediaLive に対して配信を行いつつ、Primary 側を落としたら Secondary に切り替わるのかを確認してみたいと思います。
今回は、切り替わった事が認識出来る様にそれぞれ配信コンテンツを変えて試します。
やってみた
MediaStore、MediaLive をそれぞれ作成します。
MediaStore の設定
MediaStore のコンソール画面より、"FailOverTest" という名前でコンテナを作成します。
コンテナが作成されたら、各ポリシーを以下の様に設定します。
Container policy
{ "Version" : "2012-10-17", "Statement" : [{ "Sid" : "MediaStoreFullAccess", "Effect" : "Allow", "Principal" : "*", "Action" : [ "mediastore:GetObject", "mediastore:DescribeObject" ], "Resource" : "arn:aws:mediastore:ap-northeast-1:012345678910:container/FailOverTest/*", "Condition" : { "Bool" : { "aws:SecureTransport" : "true" } } }] }
Container CORS policy
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedOrigins": [ "*" ], "MaxAgeSeconds": 3000 } ]
Object lifecycle policy
{ "rules": [ { "definition": { "path": [ { "prefix": "" } ], "days_since_create": [ { "numeric": [ ">", 14 ] } ] }, "action": "EXPIRE" } ] }
Metric policy
{ "ContainerLevelMetrics": "ENABLED" }
MediaStore の設定は以上です。「Data endpoint」は MediaLive 設定時に使用するのでメモっておきます。
MediaLive の設定
次に、MediaLive のチャンネルを作成します。
Input の作成
まずは、MediaLive の入力を作成します。
MediaLive のコンソール画面より、「入力の作成」を押下します。
「入力名」は "PrimaryInput"、「入力タイプ」は OBS を使うので "RTMP(プッシュ)" を選択します。
「Network mode」は "Public" とします。
「入力セキュリティグループ」は作成済みのものがあればそれを使用します。
既存のものがない場合は、下記の様に "作成" を選択した状態で許可する CIDR を入力し、「入力セキュリティグループの作成」を押下すれば作成できます。
テスト用に "0.0.0.0/0" を許可していますが、テスト以外で使用する場合には入力元の IP 等のみを許可する様にしましょう。
「Channel class」は "SINGLE_PIPELINE" を選択し、「アプリケーション名とインスタンス」には任意の文字列を入力してください。
「アプリケーション名とインスタンス」に指定した文字列は OBS から MediaLive に配信を行う際に使用するキーとなるため、一般に公開しない様に注意してください。※本ブログの入力は公開時には削除済みです。
ここまで設定を行い、「作成」を押下すると MediaLive の入力が作成されます。
「アプリケーション名とインスタンス」に指定した文字列が含まれたエンドポイントが確認出来るかと思います。
これは OBS の設定で使用する予定なので、メモっておきます。
今回はフェイルオーバーのテストという事で、同様の手順で入力をもう1つ作成します。
区別をし易くする為、「入力名」は "SecondaryInput" とし、「アプリケーション名とインスタンス」には別の値を指定しました。
これで MediaLive の入力の作成は完了です。
Channel の作成
続いて、MediaLive チャンネルを作成します。
MediaLive のコンソール画面より、「チャネルの作成」を押下します。
「チャネル名」を入力し、MediaLive に割り当てるロールを指定します。
ロールがない場合は、「テンプレートからロールを作成」を選択する事でロールが作成されるので、それを使用してください。
下に少しスクロールすると「Channel class」という項目があるので、こちらは "SINGLE_PIPELINE" を選択しておきます。
「チャンネルテンプレート」より、"HTTP live streaming HLS" を選択します。
選択すると、「出力グループ」に出力設定が複数作成されます。
ここで、「1.TN2224(HLS)」を押下して、出力グループ設定画面に飛びます。
出力グループ設定画面を下にスクロールすると、図の様な出力一覧が表示されている項目があります。
今回は、"出力 2" 以外は全部 "×" で削除してしまいます。
削除後はこんな感じ。
出力設定を1つにしたら上にスクロールし、「HLS グループ送信先 A」に先ほど MediaStore のコンテナを作成した時に確認したエンドポイントを入力します。
この時、エンドポイントの「https://」を「mediastoressl://」で置き換えた上で、データエンドポイント(インデックスファイル名となる)を指定する必要があります。
今回は、"mediastoressl://xxxxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com/failovertest" と入力しました。
ここから、先ほど作成した入力をアタッチしていきます。
「入力アタッチメント」の下にある「追加」を選択し、先ほど作成した「PrimaryInput」を選択して「確認」を押下すると入力がアタッチされます。
同様に、「SecondaryInput」もアタッチします。
「入力アタッチメント」にて「PrimaryInput」を選択した状態で、画面下部にある「Automatic input failover settings」を有効にします。
これがフェイルオーバーの設定項目になります。
「Secondary Input」にはもう1つの入力を選択し、「Input preference」は "PRIMARY_INPUT_PREFERRED" を選択します。
Input preference は、フェイルオーバー後に Primary が回復したら、Primary に戻すのか、そのまま Secondary を使うのか、という設定です。
設定後に「入力アタッチメント」を確認し、各入力に "Primary" "Secondary" と表示が追加されていれば OK です。
ここまで実施したらチャンネルの作成を実行し、MediaLive の設定は完了です。
OBS の設定
最後に、OBS の設定をそれぞれ行います。
Primary 側は、"Primary" という文字列を表示させた映像を送ることにします。
画面右下の「設定」より、「配信」を選択し、それぞれ項目を設定します。
- サービス ... カスタム
- サーバー ... MediaLive 入力エンドポイントから「インスタンス」を取り除いた文字列
- ストリームキー ... MediaLive 入力の「インスタンス」に指定した文字列
Secondary 側も、同様に配信設定を行います。使用する MediaLive 入力エンドポイントのみ変えてください。
フェイルオーバーを視認するため、"Secondary" と表示された映像を送ることにします。
これで、OBS の準備も完了です。
動作確認
最後に、動作確認をしていきます。
MediaLive コンソール画面のチャネルより、作成したチャネルを選択した状態で「開始」を押下します。
少し待つと、「状態」が "Running" に変化すると思います。
MediaLive のチャネルがアクティブになった事を確認し、Primary 側の OBS にて「配信開始」を押下します。
この時点で、配信出来ているか確認してみます。今回は、HLS の試聴に VideoJS HLS を使用します。
Video URL には、MediaStore のエンドポイント(https://xxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com)と、MediaLive のチャネル設定でエンドポイントとして指定した文字列(failovertest)を組み合わせた、以下を指定します。
「https://xxxxxxx.data.mediastore.ap-northeast-1.amazonaws.com/failovertest.m3u8」
特に問題がなければ、以下のように Primary 側の映像が配信されている事が確認できると思います。
Primary 側が配信されている事が確認できたので、Secondary 側の OBS も配信開始を行います。
Secondary 配信開始後に少し待って、Primary 側の OBS を配信停止にしてみました。
少し待つと、特にリロードをする事なく、自動的に Secondary 側の映像に切り替わりました!
一瞬映像が途切れますが、特に気になるレベルではなく、スムーズに映像が切り替わりました。
MediaLive のアラートを確認しても、フェイルオーバーした事が確認できます。
最後に、Primary を再度配信中に戻してみます。
少し待つと、こちらも問題なく自動的に Primary に戻りました!
これで動作確認は完了です。映像ソース側のフェイルオーバーが実行されている事を確認できました。
おわりに
MediaLive の入力フェイルオーバーを実際に試してみました!
Primary が復活したら配信ソースを Primary に戻す様な設定が可能であるため、Secondary 側に Sorry 映像(?)的なものを配信しておき、Primary 側で何か障害が発生した場合には配信を途切れさせる事なく、Sorry 映像に切り替えるといった使い方も出来そうです。
以上、AWS 事業本部の大前でした。